package com.astronomia.wheels.leet_code;

import java.util.HashMap;

/**
 * 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 *
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 *
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是"wke"，所以其长度为 3。
 * 请注意，你的答案必须是 子串 的长度，"pwke"是一个子序列，不是子串。
 *
 *
 * 输入: s = ""
 * 输出: 0
 *
 * 提示:
 *      0 <= s.length <= 5 * 104
 *      s 由英文字母、数字、符号和空格组成
 */
public class 无重复字符的最长子串 {

    private final static String test_one = "abcabcbb";
    private final static String test_two = "bbbbb";
    private final static String test_three = "pwwkew";


    public static void main(String[] args) {

        System.out.println(longestString(test_one));
        System.out.println(longestString(test_two));
        System.out.println(longestString(test_three));

    }

    /**
     * @Auth PanJF
     * @param source 字符串
     * @return 最长字串个数
     * @rmark
     */
    private static int longestString(String source){

        HashMap<Character, Integer> map = new HashMap<>();
        int max = 0;
        int start = 0;

        for (int i = 0; i < source.length(); i++) {
            char ch = source.charAt(i);
            if (map.containsKey(ch)){
                start = Math.max(map.get(ch) + 1, start);
            }
            max = Math.max(max, i - start + 1);
            map.put(ch, i);
        }
        return max;
    }


}
